# coding=utf-8
import copy

from ToolsConfig import *


def CreateItemDict(itemName, aux=0, count=1):
    """
    快速生成最基本的物品字典
    """
    itemInfo = GetItemBaseInfoSafely({'newItemName': itemName, 'newAuxValue': aux})
    return {
        'newItemName': itemName, 'newAuxValue': aux, 'count': count, 'durability': itemInfo.get('maxDurability', 0)
    }


def GetItemBaseInfoSafely(itemDict):
    """
    安全获取物品基本信息,网易接口对于不存在的物品ID_AUX获取为None
    :param itemDict:
    :return:
    """
    default = None
    if itemDict:
        default = clientCompFactory.CreateItem(LevelId).GetItemBasicInfo(
            itemDict['newItemName'], itemDict['newAuxValue'],
            (itemDict.get('enchantData', []) + itemDict.get('modEnchantData', [])).__len__() > 0
        ) or serverCompFactory.CreateItem(LevelId).GetItemBasicInfo(
            itemDict['newItemName'], itemDict['newAuxValue'],
            (itemDict.get('enchantData', []) + itemDict.get('modEnchantData', [])).__len__() > 0
        )
    default = default if default else {
        'foodNutrition': 0, 'maxDurability': 0, 'armorDefense': 0, 'tierDict': None,
        'itemType': '', 'fuelDuration': 0.0, 'foodSaturation': 0.0,
        'armorKnockbackResistance': 0.0, 'customItemType': '', 'itemTierLevel': -1,
        'maxStackSize': 64, 'weaponDamage': 0, 'itemName': '',
        'itemCategory': 'construction', 'id_aux': 0, 'armorToughness': 0
    }
    return default


def DeclareItem(itemDict):
    # type:(Dict) -> Tuple[Dict,Dict]
    """
    减少物品一个,如果个数为0则会返回空dict
    :return:减少后的物品字典,独立出来的物品
    """
    if not itemDict:
        return itemDict, {}
    itemDict['count'] -= 1
    newItem = copy.deepcopy(itemDict)
    newItem['count'] = 1
    if itemDict['count'] > 0:
        return itemDict, newItem
    else:
        return {}, newItem


def DeclareItemAnyNum(itemDict, num):
    # type:(Dict,int) -> Tuple[Dict,Dict]
    """
    减少物品多个,如果个数为0则会返回空dict
    :return:减少后的物品字典,独立出来的物品
    """
    if not itemDict:
        return itemDict, {}
    itemDict['count'] -= num
    newItem = copy.deepcopy(itemDict)
    newItem['count'] = num
    if itemDict['count'] > 0:
        return itemDict, newItem
    else:
        return {}, newItem


def StackItems(item1, item2):
    # type:(Dict,Dict) -> Dict
    """
    使item1与item2堆叠在一起,返回多余的物品
    """
    if not item1 or not item2: return {}
    if not IsSameItemAndCanStack(item1, item2): return {}
    itemInfo = GetItemBaseInfoSafely(item1)
    maxCount = itemInfo['maxStackSize']
    count1 = item1['count']
    count2 = item2['count']
    t_count = count1 + count2 - maxCount
    t_item = {}
    if t_count > 0:
        t_item = copy.deepcopy(item1)
        t_item['count'] = t_count
        item1['count'] = maxCount
    else:
        item1['count'] += item2['count']
    return t_item


def IsSameItemAndCanStack(item1, item2):
    # type:(Dict,Dict) -> bool
    """
    判断item1是否能与item2堆叠在一起
    """
    if not item1 or not item2:
        return True
    if IsSameItem(item1, item2):
        itemInfo = GetItemBaseInfoSafely(item1)
        return item1['count'] + item2['count'] <= itemInfo['maxStackSize']
    return False


def IsSameItem(item1, item2, args=('newItemName', 'newAuxValue', 'durability')):
    """
    判断item1是否与item2相同.目前判断物品ID,AUX,耐久度
    """
    if item1 and item2:
        same = True
        for key in args: same = same and item1.get(key, 0) == item2.get(key, 0)
        return same
    else:
        return False


def GetItemDurabilityPercent(itemDict, itemInfo=None):
    """
    获取耐久值百分比与总值
    :param itemDict:物品信息字典
    :param itemInfo:物品基础信息字典
    :return:
    """
    if itemInfo is None:
        itemInfo = GetItemBaseInfoSafely(itemDict)
    return (
        (itemDict.get('durability', 0.0) / float(itemInfo['maxDurability']))
        if itemInfo['maxDurability'] != 0 else 0.0,
        1.0 if itemInfo['maxDurability'] != 0 else 0.0
    )
